#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define TAM_REG 450
#define MAX_TITULO 201
#define MAX_TIPO 101
#define MAX_AUTOR 126
#define MAX_ANO 4
#define MAX_VALOR 12
#define MAX_IMAGEM 10

typedef struct obra {               /*estrutura que armazena os dados da obra atual na RAM*/ 
    char Titulo[MAX_TITULO];
    char Tipo[MAX_TIPO];
    char Autor[MAX_AUTOR];
    int Ano[MAX_ANO];
    int Valor[MAX_VALOR];
    char Imagem[MAX_IMAGEM];
} Obra;

typedef struct chave_prim {         /*estrutura contendo a chave primaria e seu respectivo NRR*/
	char Titulo[MAX_TITULO];
	int nrr;
} Chave_prim;

typedef struct registro{            /*estrutura que contem o vetor com os registros carregados na memoria*/
	Chave_prim *vetor;                /*mais a quantidade de registros*/
	int quantidade;
}Registro;
	
/*funcao que imprime o menu principal, para evitar repeticao*/ 
void ImprimeMenu(); 
/*funcao que recebe como parametro um vetor de caracteres e seu tamanho, retornando este mesmo vetor escaneado*/
char *Scaneia(char *campo, int tamanho);
/*funcao que escaneia todos os campos de uma nova estrutura*/
void  ScaneiaObra(Obra *novo, Registro reg); 
/*funcao que imprime na base de dados a ultima estrutura escaneada*/
void FilePrint(Obra *novo, FILE **fpt);
/*funcao que recebe um vetor de caracteres e seu tamanho, retornando este mesmo vetor preenchido com espacos*/
char *CompletaString(char *campo, int tamanho);
/*funcao que recebe um caractere, informando se este correspode ou nao a um numero*/
int VerificaNum(char i);
/*funcao que recebe um registro como parametro e carrega o arquivo de chaves primarias ja existente para o mesmo*/
Registro LoadChaves(Registro reg);
/*funcao que recebe os registros da memoria como parametro e grava-os no arquivo de chaves primarias ao final da execucao do programa*/ 
void GravaChaves(Registro reg);
/*funcao que busca um vetor 'alvo' recebido como parametro nos registros da memoria, tambem recebidos como parametro, para dois casos definidos pelo parametro inteiro 'caso'*/ 
int Busca(Registro reg, int caso, char *alvo);
/*funcao que lista todas as obras inseridas na base de dados, atraves dos registros da memoria passados como parametro*/
void Lista(Registro reg);
/*funcao que passa para a memoria a chave primaria e o nrr do ultimo registro escaneado*/
Registro JogaRam(Registro reg, Obra *novo);
/*funcao de string-compare modificada para ser usada nas funcoes qsort e bsearch*/
int nosso_strcmp(const void* str1, const void* str2);
/*funcao que gera o html quando eh realizada uma busca ou uma listagem*/
void make_html (FILE **fpt, int tipo, Registro reg);
